﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLGuiaSalidaMuestra
    {
        #region Metodos
        /// <summary>
        /// Método devuelve la lista guia de muestra
        /// </summary>
        /// <returns></returns>
        public List<GuiaSalidaMuestra> ListarGuiaSalidaMuestra()
        {
            return Accesor.ListarGuiaSalidaMuestra();
        }

        public List<GuiaSalidaMuestra> ListarGuiaSalidaMuestra1(string anio, string mes)
        {
            return Accesor.ListarGuiaSalidaMuestra1(anio,mes);
        }

        /// <summary>
        /// Método inserta guia de muestra
        /// </summary>
        /// <param name="zona"></param>
        /// <returns></returns>
        public int InsertarGuiaSalidaMuestra(GuiaSalidaMuestra guiaSalidaMuestra)
        {
            int codigoNuevo = this.GenerarCodigoGuiaSalida(guiaSalidaMuestra.Anio, guiaSalidaMuestra.Mes);
            guiaSalidaMuestra.CodigoGuiaSalida = codigoNuevo;
            return Accesor.InsertarGuiaSalidaMuestra(guiaSalidaMuestra);
        }

        /// <summary>
        /// Método modifica guia de muestra
        /// </summary>
        /// <param name="zona"></param>
        public void ModificarGuiaSalidaMuestra(GuiaSalidaMuestra guiaSalidaMuestra)
        {
            using (TransactionScope transaction = new TransactionScope())
            {
                var guiaSalidaMuestraEdit = Accesor.ObtenerGuiaSalidaMuestra(guiaSalidaMuestra.CodigoGuiaSalida);

                DADetalleGuiaSalidaMuestra daDetaGuia = new DADetalleGuiaSalidaMuestra();
                List<DetalleGuiaSalidaMuestra> listaTipoRelleno = daDetaGuia.ListarDetalleGuiaSalidaMuestra(guiaSalidaMuestra.CodigoGuiaSalida);
                foreach (var item in listaTipoRelleno)
                {
                    daDetaGuia.EliminarDetalleGuiaSalidaMuestra(item);
                }

                guiaSalidaMuestraEdit.Anio = guiaSalidaMuestra.Anio;
                guiaSalidaMuestraEdit.Fecha = guiaSalidaMuestra.Fecha;
                guiaSalidaMuestraEdit.Mes = guiaSalidaMuestra.Mes;
                guiaSalidaMuestraEdit.Estado = guiaSalidaMuestra.Estado;
                guiaSalidaMuestraEdit.Observacion = guiaSalidaMuestra.Observacion;
                guiaSalidaMuestraEdit.CodigoGeologo = guiaSalidaMuestra.CodigoGeologo;
                guiaSalidaMuestraEdit.DetalleGuiaSalidaMuestra = guiaSalidaMuestra.DetalleGuiaSalidaMuestra;


                Accesor.ModificarGuiaSalidaMuestra(guiaSalidaMuestraEdit);

                transaction.Complete();
            }
        }

        /// <summary>
        /// Método elimina guia de muestra
        /// </summary>
        /// <param name="codigoGuiaSalidaMuestra"></param>
        public void EliminarGuiaSalidaMuestra(int codigoGuiaSalidaMuestra)
        {
            var guiaSalidaMuestra = this.ObtenerGuiaSalidaMuestra(codigoGuiaSalidaMuestra);
            Accesor.EliminarGuiaSalidaMuestra(guiaSalidaMuestra);
        }
        /// <summary>
        /// Método anula guia de muestra
        /// </summary>
        /// <param name="codigoGuiaSalidaMuestra"></param>
        public void AnulaGuiaSalidaMuestra(int codigoGuiaSalidaMuestra)
        {
            var guiaSalidaMuestra = this.ObtenerGuiaSalidaMuestra(codigoGuiaSalidaMuestra);
            guiaSalidaMuestra.Estado = 3;
            Accesor.AnularGuiaSalidaMuestra(guiaSalidaMuestra);
        }
        /// <summary>
        /// Método enviar guia de muestra
        /// </summary>
        /// <param name="codigoGuiaSalidaMuestra"></param>
        public void EnviarGuiaSalidaMuestra(int codigoGuiaSalidaMuestra)
        {
            var guiaSalidaMuestra = this.ObtenerGuiaSalidaMuestra(codigoGuiaSalidaMuestra);
            guiaSalidaMuestra.Estado = 4;
            Accesor.EnviarGuiaSalidaMuestra(guiaSalidaMuestra);
        }

        /// <summary>
        /// Método devuelve una guia de muestra
        /// <param name="codigoZona"></param>
        /// <returns></returns>
        public GuiaSalidaMuestra ObtenerGuiaSalidaMuestra(int codigoGuiaSalidaMuestra)
        {
            var guia =Accesor.ObtenerGuiaSalidaMuestra(codigoGuiaSalidaMuestra);
            ///se obtiene el detalle guia de muestra
            if (guia != null)
            {
                guia.DetalleGuiaSalidaMuestra = AccesorDGM.ListarDetalleGuiaSalidaMuestra(guia.CodigoGuiaSalida);
            }
            return guia;
        }

        #endregion
        #region Utilidades
        /// <summary>
        /// Método que genera guia de muestra
        /// </summary>
        /// <returns></returns>
        public int GenerarCodigoGuiaSalida(string anio, string mes)
        {
            int codigoMaximo = 1;
            string anioOriginal = anio;
            anio=anio.Substring(2, 2); // 2014 -> 14
            var lista = Accesor.ListarGuiaSalidaMuestra1(anioOriginal, mes);
            if (lista != null)
            {
                if (lista.Count > 0)
                {
                    codigoMaximo = lista.Max(x => x.CodigoGuiaSalida);
                    codigoMaximo = codigoMaximo + 1;
                }
                else
                {
                    string correlativo = Convert.ToString(codigoMaximo); 
                    var datos = string.Format("{0}{1}{2}", anio, mes.PadLeft(2, '0'), correlativo.PadLeft(4, '0').ToString());
                    codigoMaximo = Convert.ToInt32(datos);
                }
            }
            else
            {
                string correlativo = Convert.ToString(codigoMaximo); 
                var datos = string.Format("{0}{1}{2}", anio, mes.PadLeft(2, '0'), correlativo.PadLeft(4, '0').ToString());
                codigoMaximo = Convert.ToInt32(datos);
            }
            return codigoMaximo;
        }
        #endregion

        #region Accesor
        private static DAGuiaSalidaMuestra Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DAGuiaSalidaMuestra(); }
        }
        #endregion
        #region Accesor EstructuraTipoRelleno
        private static DADetalleGuiaSalidaMuestra AccesorDGM
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DADetalleGuiaSalidaMuestra(); }
        }
        #endregion

    }
}
